package seguranca;


import daos.ClienteDao;
import daos.QuartoDAO;
import daos.ReservaDao;
import daos.UsuarioDAO;
import entidades.Usuario;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import negocio.NegocioException;


public class Perfil implements Serializable{
    private HashMap<String,String[]> acesso;
    private final static String[] METODOS_PADROES = {"inserir","alterar","deletar","pesquisar"};
	
	public Perfil() {
		acesso = new HashMap<String,String[]>();
	}	
	
	private void adicionarRegra(Class<?> classe, String[] metodos){
		acesso.put(classe.toString(),metodos);		
	}
	
	private void adicionarRegra(Class<?> classe, String[] metodos, String ... ms){
		ArrayList<String> mts = new ArrayList<String>();
		for (String m : metodos) {
			mts.add(m);
		}
		for (String m : ms) {
			mts.add(m);
		}
		acesso.put(classe.toString(),mts.toArray(new String[0]));		
	}
	
	private void adicionarRegraEspecifica(Class<?> classe, String ... metodos){
		ArrayList<String> mts = new ArrayList<String>();
		for (String m : metodos) {
			mts.add(m);
		}
		acesso.put(classe.toString(),mts.toArray(new String[0]));		
	}

	public void carregarPerfil(UsuarioDAO usuario) throws NegocioException {
		if (usuario == null || usuario.getUsuario().getNivel().trim().equals("")){
			throw new NegocioException(
					"Usurio inválido para carregar o perfil");
		}
		acesso.clear();
		String nomePerfil = usuario.getUsuario().getNivel();
                Credencial.setUsuarioLogado(usuario);
              
		// PERFIL ADMINISTRADOR

		if (nomePerfil.equals(Usuario.NIVEL_ADMINISTRADOR)){
			adicionarRegra(UsuarioDAO.class, METODOS_PADROES);
                        adicionarRegra(ClienteDao.class, METODOS_PADROES);
                        adicionarRegra(QuartoDAO.class,METODOS_PADROES);
			//adicionarRegra(classe, metodos);
			return;
		}
                // PERFIL GERENTE
                if (nomePerfil.equals(Usuario.NIVEL_GERENTE)){
			adicionarRegraEspecifica(UsuarioDAO.class,"pesquisar");
                        adicionarRegra(ClienteDao.class, METODOS_PADROES);
                        adicionarRegra(QuartoDAO.class,METODOS_PADROES);
                         adicionarRegra(ReservaDao.class,METODOS_PADROES);
			return;
		}
                // PERFIL CLIENTE
                if(nomePerfil.equals(Usuario.NIVEL_CLIENTE)){
                   return;
                }
		
		
	}

       

	public boolean temAcesso(String classe, String metodo){
		String[] permitidos = acesso.get(classe);
		if (permitidos == null){
			return false;
		}
		for (String mt : permitidos) {
			if (mt.equals(metodo)){
				return true;
			}
		}
		return false;
	}
	
	public void limpar() {
		acesso.clear();
	}
}